home *** CD-ROM | disk | FTP | other *** search
/ Nautilus 1992 July / Nautilus-3-8 / Nautilus-3-8.bin / Tools & Utilities / Techy Stuff / Source ƒ / Filelist ƒ / Mouse.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-09-14  |  5.2 KB  |  254 lines

  1. /*
  2.     FileList 1.4
  3.     "Mouse.c"
  4. */
  5.  
  6. #include "Main.h"
  7. #include "Window.h"
  8. #include "Mouse.h"
  9.  
  10. /* Used by ScrollText() */
  11. static WindowPtr Window;    /* Current window */
  12. static short Page;            /* Page size */
  13. static short Row;            /* Character height/width */
  14. static Boolean Vertical;    /* TRUE if vertical scroll */
  15.  
  16. /* ----- Scroll window data -------------------------------------------- */
  17.  
  18. void Scroll (
  19.     register WindowPtr w,
  20.     Boolean vertical,
  21.     register short delta)
  22. {
  23.     register void (*pf)();    /* Pointer to function */
  24.     Rect r;
  25.     RgnHandle updateRgn, clip;
  26.  
  27.     updateRgn = NewRgn();
  28.     if (vertical) {
  29.         ContentRect(w, &r);
  30.         ScrollRect(&r, 0, delta * ((WindowDataPtr)w)->height, updateRgn);
  31.         if (delta == -1 || delta == 1)
  32.             pf = RedrawV1;
  33.         else {
  34.             pf = RedrawV;
  35.             delta = FALSE;
  36.         }
  37.     } else {
  38.         ContentHeaderRect(w, &r);
  39.         ScrollRect(&r, delta * ((WindowDataPtr)w)->width, 0, updateRgn);
  40.         if (delta == -1 || delta == 1) {
  41.             pf = /*RedrawH1*/ RedrawV;
  42.             delta = FALSE;
  43.         } else {
  44.             pf = /*RedrawH*/ RedrawV;
  45.             delta = FALSE;
  46.         }
  47.     }
  48.     clip = w->clipRgn;
  49.     w->clipRgn = updateRgn;
  50.     (*pf)(w, delta);
  51.     w->clipRgn = clip;
  52.     DisposeRgn(updateRgn);
  53. }
  54.  
  55. /* ----- Resize window's scroll bar ------------------------------------ */
  56.  
  57. static void FixScrollBar1 (
  58.     register ControlHandle ch,
  59.     Rect *r)
  60. {
  61.     HideControl(ch);
  62.     MoveControl(ch, r->left, r->top);
  63.     SizeControl(ch, r->right - r->left, r->bottom - r->top);
  64.     ShowControl(ch);
  65.     ValidRect(&(**ch).contrlRect);
  66. }
  67.  
  68. void FixScrollBar (register WindowDataPtr w)
  69. {
  70.     Rect r;
  71.  
  72.     VScrollRect((WindowPtr)w, &r);
  73.     FixScrollBar1(w->vs, &r);
  74.     HScrollRect((WindowPtr)w, &r);
  75.     FixScrollBar1(w->hs, &r);
  76. }
  77.  
  78. /* ----- Adjust scroll bars to size of data ---------------------------- */
  79.  
  80. static void AdjustScrollBar1 (
  81.     register ControlHandle ch,
  82.     register short maxTop,
  83.     short active)
  84. {
  85.     if (maxTop <= 0) {
  86.         maxTop = 0;
  87.         HiliteControl(ch, 255);
  88.     } else
  89.         HiliteControl(ch, active);
  90.     SetCtlMax(ch, maxTop);
  91. }
  92.  
  93. void AdjustScrollBar (register WindowDataPtr w)
  94. {
  95.     register short a;
  96.     Rect r;
  97.  
  98.     a = (FrontWindow() == (WindowPtr)w) ? 0 : 255;
  99.     ContentRect((WindowPtr)w, &r);
  100.     AdjustScrollBar1(w->vs,
  101.         (short)(w->count - (r.bottom - r.top)/w->height), a);
  102.     AdjustScrollBar1(w->hs,
  103.         w->columns - (r.right - r.left)/w->width, a);
  104. }
  105.  
  106. /* ------ Scroll text within window (called by TrackControl()) --------- */
  107.  
  108. static pascal void ScrollText (
  109.     register ControlHandle ch,
  110.     register short part)
  111. {
  112.     register short delta;
  113.     register short ex;
  114.  
  115.     switch(part) {
  116.         case inUpButton:
  117.             delta = -Row;
  118.             break;
  119.         case inDownButton:
  120.             delta = Row;
  121.             break;
  122.         case inPageUp:
  123.             delta = -Page;
  124.             break;
  125.         case inPageDown:
  126.             delta = Page;
  127.             break;
  128.         default:
  129.             return;
  130.     }
  131.     SetCtlValue(ch, (ex = GetCtlValue(ch)) + delta);
  132.     Scroll(Window, Vertical, ex - GetCtlValue(ch));
  133. }
  134.  
  135. /* ------ Handle mouse-down event in scroll bar ------------------------ */
  136.  
  137. void DoScroll (
  138.     register WindowDataPtr w,
  139.     register Point pt,
  140.     register short part,
  141.     register ControlHandle ch)
  142. {
  143.     register short ex;
  144.     Rect r;
  145.  
  146.     ContentRect((WindowPtr)w, &r);
  147.     Row = 1;
  148.     if (ch == w->vs) {
  149.         Vertical = TRUE;
  150.         Page = (r.bottom - r.top)/w->height - 1;
  151.     } else
  152.         if (ch == w->hs) {
  153.             Vertical = FALSE;
  154.             Page = (r.right - r.left)/w->width - 1;
  155.         } else
  156.             return;
  157.     if (part == inThumb) {
  158.         ex = GetCtlValue(ch);
  159.         part = TrackControl(ch, pt, 0L);
  160.         SetCtlValue(ch, GetCtlValue(ch));
  161.         Scroll((WindowPtr)w, Vertical, ex - GetCtlValue(ch));
  162.     } else {
  163.         Window = (WindowPtr)w;
  164.         part = TrackControl(ch, pt, ScrollText);
  165.     }
  166. }
  167.  
  168. /* ----- Scroll with cursor keys --------------------------------------- */
  169.  
  170. void KeyScroll (
  171.     register WindowDataPtr w,
  172.     Boolean vertical,
  173.     register short part)
  174. {
  175.     register ControlHandle ch;
  176.     Rect r;
  177.  
  178.     SetPort(Window = (WindowPtr)w);
  179.     ContentRect((WindowPtr)w, &r);
  180.     Row = 1;
  181.     if (vertical) {
  182.         Vertical = TRUE;
  183.         Page = (r.bottom - r.top)/w->height - 1;
  184.         ch = w->vs;
  185.     } else {
  186.         Vertical = FALSE;
  187.         Page = (r.right - r.left)/w->width - 1;
  188.         ch = w->hs;
  189.     }
  190.     ScrollText(ch, part);
  191. }
  192.  
  193. /* ----- Mouse click in window content region -------------------------- */
  194.  
  195. void DoContent (
  196.     register EventRecord *event,
  197.     register WindowPtr w)
  198. {
  199.     Point local;
  200.     register short part;
  201.     ControlHandle control;
  202.     Rect r;
  203.  
  204.     if (w != FrontWindow())
  205.         SelectWindow(w);
  206.     else {
  207.         SetPort(w);
  208.         local = event->where;
  209.         GlobalToLocal(&local);
  210.         part = FindControl(local, w, &control);
  211.         if (part)            /* Control region */
  212.             DoScroll((WindowDataPtr)w, local, part, control);
  213.         else {                /* Content region */
  214.             ContentRect(w, &r);
  215.             if (PtInRect(local, &r))
  216.                 FindRow((WindowDataPtr)w, local);
  217.         }
  218.     }
  219. }
  220.  
  221. /* ----- Mouse Click in grow region ------------------------------------ */
  222.  
  223. void DoGrow (
  224.     register WindowPtr w,
  225.     register Point GlobalMouse)
  226. {
  227.     register long newSize;
  228.  
  229.     if (w != FrontWindow()) {
  230.         SelectWindow(w);
  231.         return;
  232.     }
  233.     if (newSize = GrowWindow(w, GlobalMouse, &Bounds))
  234.         SetWindowSize((WindowDataPtr)w, LoWord(newSize), HiWord(newSize));
  235. }
  236.  
  237. /* ----- Mouse Click in zoom region ------------------------------------ */
  238.  
  239. void DoZoom (
  240.     register WindowPtr w,
  241.     register short where)
  242. {
  243.     if (w != FrontWindow()) {
  244.         SelectWindow(w);
  245.         return;
  246.     }
  247.     SetPort(w);
  248.     EraseRect(&w->portRect);
  249.     ZoomWindow(w, where, TRUE);
  250.     InvalRect(&w->portRect);
  251.     FixScrollBar((WindowDataPtr)w);        /* Resize window's scroll bar */
  252.     AdjustScrollBar((WindowDataPtr)w);    /* Adjust to size of document */
  253. }
  254.